package com.xgimi.locales.utils

import com.xgimi.locales.bean.ModuleBean
import com.xgimi.locales.bean.XmlFileBean
import java.io.File
import java.util.regex.Pattern

object FileUtil {

    /**
     * 查找是否为有资源的模块
     */
    fun findAllModule(projectFile: File, block: (File) -> Unit): MutableList<ModuleBean> {
        val list = mutableListOf<File>()
        findAllFileOrDir(projectFile, list) {
            val isModuleDir = it.isModuleDir()
            if (isModuleDir) {
                block(it)
            }
            isModuleDir
        }
        return list.map { file ->
            ModuleBean().also { bean ->
                bean.moduleName = file.name
                bean.moduleFilePath = file.absolutePath
                if (File(file.absolutePath, "src/main/res").exists()) {
                    bean.moduleResPath = "src/main/res"
                } else if (File(file.absolutePath, "Android.mk").exists() ||
                    File(file.absolutePath, "Android.bp").exists()) {
                    // 存在模块，但不存在src/main/res的资源目录，兼容系统应用的资源目录.
                    bean.moduleResPath = "res"
                }
            }
        }.toMutableList()
    }

    @JvmStatic
    fun findAllFileOrDir(rootDir: File, list: MutableList<File>, trans: (File) -> Boolean) {
        if (rootDir.isDirectory && rootDir.listFiles().isEmpty()) {
            return
        } else {
            if (rootDir.isDirectory) {
                // 过滤不必要的目录，恶心，浪费时间
                rootDir.listFiles().forEach {
                    if (it.isDirectory) {
                        // 过滤掉不必要的文件夹以及文件
                        if (!listOf(".git", ".idea", ".gradle", "build", "libs", "gradle", "src", "res").contains(it.name)) {
                            if (trans(it)) list.add(it)
                            findAllFileOrDir(it, list, trans)
                        }
                    }
                }
            } else { // TODO: 多余代码，文件不需要进行判断
                if (trans(rootDir)) list.add(rootDir)
            }
        }
    }

    /**
     * 扫描module src/main/res 中的资源 xml
     */
    fun findLangByModule(allModuleDir: MutableList<ModuleBean>, block: (File) -> Unit) {
        for (i in allModuleDir.indices) {
            val langs = ArrayList<XmlFileBean>()
            val moduleBean = allModuleDir[i]
//            val valuesDir = File(moduleBean.moduleFilePath, "src/main/res")
            val valuesDir = File(moduleBean.moduleFilePath, moduleBean.moduleResPath)
            if (valuesDir.exists() && valuesDir.isDirectory) { //查找语言类型
                // 比如 values-es,values-en-rGB,values-zh-rCN... ...等
                for (file in valuesDir.listFiles()) {
                    val fileName = file.name
                    if (file.isDirectory && fileName.contains("-")) {
                        val langName = fileName.substring(fileName.indexOf("-") + 1)
                        if (null != langName && langName.isNotEmpty() &&
                            !langName.contains("dpi") &&
                            (Pattern.compile("[a-z]{0,4}").matcher(langName).matches() || Constant.langMap[langName] != null)
                        ) {
                            langs.add(XmlFileBean().also {
                                it.langName = langName
                                val xmlStrFile = File(file.absolutePath, "strings.xml")
                                it.filePath = xmlStrFile.absolutePath
                                block(xmlStrFile)

                            })
                            moduleBean.xmlFiles = langs
                        }
                    }
                }
            }
            println("findLangByModule valuesDir:$valuesDir；xml lang Files size${moduleBean.xmlFiles.size}")
        }
    }

}

//匹配模块规则--判断当前文件夹是否是模块的根目录
fun File.isModuleDir(): Boolean {
    if (!isDirectory) return false
    //包含至少一个.gradle文件
    var gradleFiles = listFiles().find { it.isFile && it.name.matches(Regex("^[a-zA-Z0-9-_]+.gradle$")) }
    //必须有src\main\java 或者 src\main\kotlin 路径
    var isContainCodeDir = File(this, "src/main/java").exists() || File(this, "src/main/kotlin").exists()
    var isContainResource = File(this, "src/main/res").exists()

    // 兼容系统应用，如果无资源模块，再次扫描确认下是否为系统应用的目录，比如TvSettings等.
    if (!(isContainCodeDir && isContainResource && gradleFiles != null)) {
        if (File(this, "Android.mk").exists() || File(this, "Android.bp").exists()) {
//            if (!isContainCodeDir) {
//                isContainCodeDir = File(this, "src").exists()
//            }
            isContainCodeDir = true
            if (!isContainResource) {
                isContainResource = File(this, "res").exists()
            }
            gradleFiles = File("Look before you leap.")
        }
    }

    println("isModuleDir file:$name, path:$absolutePath, gradleFiles=$gradleFiles, isContainCodeDir=$isContainCodeDir, isContainResource=$isContainResource")
    return isContainResource && isContainCodeDir && gradleFiles != null
}
